/* 
 * File:   InvertedFile.cpp
 * Author: eduardo
 *
 * Created on 14 de noviembre de 2012, 14:20
 */

#include "InvertedFile.h"

InvertedFile::InvertedFile() {
    _count = _countID = 1;
    _dict = new Dictionary();
    _pf = new PostingFile();
}

InvertedFile::~InvertedFile() {
    delete _dict;
    delete _pf;
}

int InvertedFile::getDictSize() {
    return _dict->getSize();
}

void InvertedFile::addDoc(DocTerms* index, const string& name) {
    map<string, int>::iterator it = index->getBegin();
    int aux = 0;

    while (it != index->getEnd()) {
        aux = _dict->insertTerm(it->first, _count);
        if (aux) {
            // Nuevo termino, insertar nueva aparicion
            DocOccurrence doc(_countID, it->second);
            _pf->insertElement(_count, doc);
            _count++;
        } else {
            // Termino existente, añadir aparicion adicional
            DocOccurrence doc(_countID, it->second);
            _pf->insertElement(_dict->getValue(it->first), doc);
        }

        ++it;
    }

    _docsID.push_back(IdDocs(_countID, name));
    _countID++;
}

void InvertedFile::toPersist() {
    map<string, int>::iterator itD = _dict->getBegin();

    // IdDocs
    vector<IdDocs>::iterator itId = _docsID.begin();
    while (itId != _docsID.end()) {
        AgentDB::getAgentePtr()->persistIDDoc(itId->getID(), itId->getDoc());
        ++itId;
    }

    while (itD != _dict->getEnd()) {
        // Comprobar si se encuentra en la DB
        if (AgentDB::getAgentePtr()->existTerm(itD->first)) {
            // Si está, actualizar campos correspondientes
            //cout << "Termino " << itD->first << " existente; actualizando ocurrencias..." << endl;
            AgentDB::getAgentePtr()->updateTerm(itD->first, _pf->getValue(itD->second));
        } else {
            // Si no está, insertar en DB
            //cout << "Guardando término: " << itD->first << endl;
            AgentDB::getAgentePtr()->persistDictTerm(itD->first, itD->second);
            AgentDB::getAgentePtr()->persistPFLine(itD->second, _pf->getValue(itD->second));
        }

        // Incrementar iteradores
        ++itD;
    }

    // Vaciar estructuras
    _dict->clear();
    _pf->clear();
    _docsID.clear();
}